#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

	const 	long 	maxn=10100;

	long	max[maxn];
	long	pre[maxn];
	long	len[maxn];
	long	lpos[30][2];
	long	set[maxn][30];
	long	bin[30];
	char	st[maxn][30];
	long	res,p;
	

int out(long x)
{
    if (pre[x]!=0) out(pre[x]);
    printf("%s\n",st[x]);
    return 0;
}

int sort_func(const void *a,const void *b)
{
    return (strlen((char*)a)-strlen((char*)b));
}

int contain(long x,long y)
{
    int	i;
    for (i=0;i<26;i++)
    	if (set[y][i]>set[x][i]) return 0;
	return 1;
}

main()
{
    long	i,j,k,n;
    char	temp[30];

//    freopen("e.in","r",stdin);
//    freopen("e.out","w",stdout);

    memset(bin,0,sizeof(bin));
    memset(max,0,sizeof(max));
    memset(pre,0,sizeof(pre));
    memset(len,0,sizeof(len));
    memset(set,0,sizeof(set));
    memset(lpos,0,sizeof(lpos));
    
   
//    for (i=0;i<=26;i++)
//    	bin[i]=(1<<i);

    n=0;
    while (scanf("%s",st[++n])!=EOF)
    {
    }
	n--;
    qsort((void *)st,n+1,sizeof(st[0]),sort_func);
	

    for (i=1;i<=n;i++)
    {
        len[i]=strlen(st[i]);
        for (j=0;j<len[i];j++)
        	set[i][st[i][j]-'a']++;
    	if (len[i]>len[i-1]) lpos[len[i]][0]=i;
    	if (i>lpos[len[i]][1]) lpos[len[i]][1]=i;
   	}   	
    res=0;p=1;
    for (i=lpos[2][0];i<=n;i++)
    	for (j=lpos[len[i]-1][0];j<=lpos[len[i]-1][1];j++)
   			if (contain(i,j))
   				if (max[j]+1>max[i])
	   				{
    				    max[i]=max[j]+1;
    				    pre[i]=j;
    				    if (max[i]>res) {res=max[i];p=i;}
             		}
//   		printf("%ld\n",res+1);//dzr
//   		for (i=1;i<=n;i++) printf("%s %ld pre=%ld \n",st[i],max[i]+1,pre[i]);//dzr
    out(p);
    return 0;
}